import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error


def CleanData(df) -> pd.DataFrame :
    """
    Очищает данные:
    1. замена пропущенных значений
    2. замена названий
    3. удаление дубликатов
    """

    numeric_columns = df.columns[1:]  # Все столбцы, начиная со второго

    # Замена пропущенных значений в столбцах на среднее значение
    df[numeric_columns] = df[numeric_columns].apply(lambda x: x.fillna(x.mean()))

    # Замена пропущенных значений в первом столбце на "неизвестно"
    df.iloc[:, 0] = df.iloc[:, 0].fillna("неизвестно")

    # Замена отсутствующие значения на среднее значение столбца:
    df.drop_duplicates(inplace=True)

    return df



# Загрузка данных из CSV файла
df = pd.read_csv('Laptop_price.csv')
#print("Прочитано:\n", df, "\n")

df = CleanData(df)

#print("После очистки:\n", df, "\n")

# Замена производителей на уникальный аутентификатор
df["Brand"] = pd.factorize(df["Brand"])[0]
#Замена вещественных 
#df.iloc[:, -1] = df.iloc[:, -1].round()
#df.iloc[:, -1] = df.iloc[:, -1] // 5000 * 5000

#print("После замен:\n", df, "\n")

#print(df.iloc[:,-1])

# Построение тепловой карты с использованием seaborn
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt=".3f", vmin=-1, vmax=1)
plt.title('Тепловая карта корреляции')
plt.show()



sym = input("Желаете удалить столбец?\n")
while (sym == 'y') :
    col=int(input("Какой столбец удалить?\n"))

    df = df.drop(df.columns[col-1], axis=1)

    plt.figure(figsize=(10, 8))
    sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt=".3f", vmin=-1, vmax=1)
    plt.title('Тепловая карта корреляции')
    plt.show()

    sym = input("Желаете удалить столбец?\n")


X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)


# Создаем и обучаем многослойный персептрон регрессор
mlp_regressor = MLPRegressor(hidden_layer_sizes=(4, 4), max_iter=800, random_state=42, solver="adam")
mlp_regressor.fit(X_train, y_train)

# Предсказываем значения для тестовой выборки
y_pred = mlp_regressor.predict(X_test)

# Оцениваем качество модели
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error on Test Data: {mse}")

test = mlp_regressor.predict(np.array([0, 1.604, 8, 256, 11.21558, 3.8576]).reshape(1, -1))
print("Тест руками", test)
print("Ожидвем", 9407.47)
